const http = require('http');
const fs = require('fs');
const mysql = require('mysql');

// 自己写的简易接口 interfaces 一个对象，里面包含多个接口方法
const interfaces = require('./interfaces.js');
// 数据库连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'a13789',
  database: 'game'
});
// 连接数据库
// connection.connect();
// const connection = {};
// 将请求的 url 解析为 {path: "", params:{}} 结构
function parseUrl(url) {
  const splitPathAndParams = url.split("?");
  const ret = {};
  let params = [];
  ret.path = splitPathAndParams[0];
  ret.params = {};
  splitPathAndParams[1] && (params = splitPathAndParams[1].split("&"));
  params.forEach(item => {
    const str = item.split("=");
    ret.params[str[0]] = str[1];
  })
  return ret;
}

const server = http.createServer((req, res) => {
  // 接受收数据
  let str = '';
  req.on('data',  data => str += data);
  // 接受数据完成
  req.on('end', () => {
    // 跨域
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
    // 字符编码
    res.setHeader("ContentType", "charset=utf-8");
    res.setHeader("Encoding", "utf-8");
    // 获取URL信息
    const urlObj = parseUrl(req.url);
    // 获取请求体data参数;
    let bodyObj = {};
    // get请求 str 为空 无法parse为json 所以catch一哈
    try {bodyObj = JSON.parse(str);} catch (e) { str && console.log(e) };
    if (req.method === "GET") {
      console.log(req.url);
      try { // 匹配到小数点  则认为是请求文件 // 否则视为 get 请求接口
        if (urlObj.path.match(/\./)) {
          try {
            res.end(fs.readFileSync("./serve/www/" + urlObj.path));
          } catch (e) {
            res.end(fs.readFileSync("./serve/" + urlObj.path));
          }
          return;
        } else interfaces[urlObj.path.split("/").pop()](res, urlObj, bodyObj, connection);
      } catch (e) {
        console.log(e);
        res.end('{"ok": false, "code": 404, "msg":"get 执行失败"}');
      } // 无法处理 则为 404
    } else if (req.method === "POST") { // post为请求接口
      try {interfaces[urlObj.path.split("/").pop()](res, urlObj, bodyObj, connection);}
      catch (e) {
        console.log(e);
        res.end('{"ok": false, "code": 404, "msg":"post 执行失败"}');
      } // 无法处理 则为 404
    } else res.end('{"ok": false, "code": 404, "msg": "暂只处理 get put"}'); // 暂不处理 put delete
  });
});
// 将服务挂在8999 端口
server.listen(8999);
console.log("your server is runing on port 8999!");
